package telas.produto;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import org.richfaces.event.UploadEvent;
import org.richfaces.model.UploadItem;
import business.dados.Persistente;
import business.produto.Empresa;
import business.produto.Fabricante;
import business.produto.Imagem;
import business.produto.Produto;
import business.sistema.ExceptionSistema;
import business.sistema.IObjetoSistema;

public class TelaProdutoCadastro
{
	private Produto produto;
	private Imagem imagemSelecionada;
	
	private List<Imagem> imagensRemovidas = new ArrayList<Imagem>();
	
	private List<IObjetoSistema> fabricantes = new ArrayList<IObjetoSistema>();
	private String nomeFabricantePesquisa = "";
	
	private List<IObjetoSistema> empresas = new ArrayList<IObjetoSistema>();
	private String nomeEmpresaPesquisa = "";
	
	private List<UploadItem> uploadItens = new ArrayList<UploadItem>();

	public void setProduto(Produto produto)
	{
		this.produto = produto;
	}

	public Produto getProduto()
	{
		return produto;
	}
	
	public List<IObjetoSistema> getImagens()
	{
		List<IObjetoSistema> imagens = new ArrayList<IObjetoSistema>();
		
		if(produto != null && produto.getImagens() != null)
		{
			imagens.addAll(produto.getImagens());
		}
		
		return imagens;
	}
	
	public void setImagemSelecionada(Imagem imagemSelecionada)
	{
		this.imagemSelecionada = imagemSelecionada;
	}

	public Imagem getImagemSelecionada()
	{
		return imagemSelecionada;
	}

	public String novo()
	{
		produto = new Produto();
		
		fabricantes = new ArrayList<IObjetoSistema>();
		nomeFabricantePesquisa = "";
		
		empresas = new ArrayList<IObjetoSistema>();
		nomeEmpresaPesquisa = "";
		
		
		return "telaProdutoCadastro";
	}
	
	public String editar()
	{
//		fabricantes = new ArrayList<IObjetoSistema>();
//		nomeFabricantePesquisa = produto.getNomeFabricante();
//		
//		empresas = new ArrayList<IObjetoSistema>();
//		nomeEmpresaPesquisa = produto.getNomeEmpresa();
		
		return "telaProdutoCadastro";
	}
	
	public void listener(UploadEvent event)
	{
		UploadItem item = event.getUploadItem();
		
		uploadItens.add(item);
	}
	
	// ############################################# 
	//  MÉTODOS DE INTERFACE PARA IMPLEMENTAR A BUSCA POR UM FABRICANTE
	// #############################################	
	public void setFabricanteSelecionado(Fabricante fabricanteSelecionado)
	{
		produto.setFabricante(fabricanteSelecionado);
	}

	public Fabricante getFabricanteSelecionado()
	{
		return produto.getFabricante();
	}
	
	public void setFabricantes(List<IObjetoSistema> fabricantes)
	{
		this.fabricantes = fabricantes;
	}

	public List<IObjetoSistema> getFabricantes()
	{
		return fabricantes;
	}

	public void setNomeFabricantePesquisa(String nomeFabricantePesquisa)
	{
		this.nomeFabricantePesquisa = nomeFabricantePesquisa;
	}

	public String getNomeFabricantePesquisa()
	{
		return nomeFabricantePesquisa;
	}
	
	public String pesquisarFabricante() 
	{
		try
		{
			setFabricantes(Persistente.getInstance().getCollection(Fabricante.class, filtroFabricante()));
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex);
		}
		
		return null;
	}
	
	public String filtroFabricante()
	{
		StringBuilder filtro = new StringBuilder(" 1 = 1");
		
		filtro.append(" AND this_.nome LIKE '%" + nomeFabricantePesquisa + "%' ");
		
		filtro.append(" ORDER BY this_.nome ");
		
		return filtro.toString();
	}
	
	// ############################################# 
	// FIM - PESQUISA FABRICANTE
	// #############################################
	
	// ############################################# 
	//  MÉTODOS DE INTERFACE PARA IMPLEMENTAR A BUSCA POR UMA EMPRESA
	// #############################################	
	
	public void setEmpresaSelecionado(Empresa empresaSelecionado)
	{
		produto.setEmpresa(empresaSelecionado);
	}

	public Empresa getEmpresaSelecionado()
	{
		return produto.getEmpresa();
	}
	
	public void setEmpresas(List<IObjetoSistema> empresas)
	{
		this.empresas = empresas;
	}

	public List<IObjetoSistema> getEmpresas()
	{
		return empresas;
	}
	
	public void setNomeEmpresaPesquisa(String nomeEmpresaPesquisa)
	{
		this.nomeEmpresaPesquisa = nomeEmpresaPesquisa;
	}

	public String getNomeEmpresaPesquisa()
	{
		return nomeEmpresaPesquisa;
	}
	
	public String pesquisarEmpresa() 
	{
		try
		{
			setEmpresas(Persistente.getInstance().getCollection(Empresa.class, filtroEmpresa()));
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex);
		}
		
		return null;
	}
	
	public String filtroEmpresa()
	{
		StringBuilder filtro = new StringBuilder(" 1 = 1");
		
		filtro.append(" AND this_.nome LIKE '%" + nomeEmpresaPesquisa + "%' ");
		
		filtro.append(" ORDER BY this_.nome ");
		
		return filtro.toString();
	}
	
	// ############################################# 
	// FIM - PESQUISA EMPRESA
	// #############################################
	
	public String salvar()
	{
		
		try
		{
			if(produto.getCodigo() < 1)
			{
				produto.salvarWEB();
			}
			
			// Adiciona as imagens
			for(UploadItem uploadItem :  uploadItens)
			{
				Imagem imagem = new Imagem();
				
				imagem.setImagem(uploadItem.getFileName());
				
				produto.addImagem(imagem);
			}
			
			produto.salvarWEB();
			
			if(produto.getImagens() != null)
			{
				for(Imagem imagem : produto.getImagens())
				{
					for(UploadItem uploadItem :  uploadItens)
					{				
						if(imagem.getImagem().equals(uploadItem.getFileName()))
						{
							int indicePonto = imagem.getImagem().lastIndexOf('.');
							String extencaoImagem = imagem.getImagem().substring(indicePonto +1);
							
							FacesContext context = FacesContext.getCurrentInstance();
							HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
							
							String caminhoImagem = request.getRealPath("/") +"imagens_produtos/" + imagem.getCodigo() + "." + extencaoImagem;
							
							uploadItem.getFile().renameTo(new File(caminhoImagem));
							
							imagem.setImagem(imagem.getCodigo() + "." + extencaoImagem);
						}
					}
				}
				
				produto.salvarWEB();
				
				// Remove as imagens do disco
				for(Imagem imagem : imagensRemovidas)
				{
					FacesContext context = FacesContext.getCurrentInstance();
					HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();
					
					File arquivo = new File(request.getRealPath("/") +"imagens_produtos/" + imagem.getImagem());

					arquivo.delete();
				}
			}
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex);
		}
		
		limparTela();
		
		return "telaProduto";
	}
	
	public String cancelar()
	{
		try
		{
			produto.desfazerModificacao();
			
			limparTela();
		}
		catch(Exception ex)
		{
			new ExceptionSistema(ex);
		}
		
		return "telaProduto";
	}
	
	public void limparTela()
	{
		if(uploadItens != null)
		{
			uploadItens.clear();
		}
		
		if(fabricantes != null)
		{
			fabricantes.clear();
		}
		
		nomeFabricantePesquisa = "";
		
		if(empresas != null)
		{
			empresas.clear();
		}
		
		imagemSelecionada = null;
		
		if(imagensRemovidas != null)
		{
			imagensRemovidas.clear();
		}
		
		nomeEmpresaPesquisa = "";
		
		produto = null;
	}
	
	public void removerImagem()
	{
		produto.removerImagem(imagemSelecionada);
		
		imagensRemovidas.add(imagemSelecionada);
	}
}
